if (err)
goto fail;
- err = xenbus_switch_state(dev, XBT_NULL, XenbusStateInitWait);
+ err = xenbus_switch_state(dev, XenbusStateInitWait);
if (err)
goto fail;
break;
case XenbusStateClosing:
- xenbus_switch_state(dev, XBT_NULL, XenbusStateClosing);
+ xenbus_switch_state(dev, XenbusStateClosing);
break;
case XenbusStateClosed:
goto abort;
}
- err = xenbus_switch_state(dev, xbt, XenbusStateConnected);
- if (err)
- goto abort;
-
err = xenbus_transaction_end(xbt, 0);
if (err == -EAGAIN)
goto again;
if (err)
xenbus_dev_fatal(dev, err, "ending transaction");
+
+ err = xenbus_switch_state(dev, XenbusStateConnected);
+ if (err)
+ xenbus_dev_fatal(dev, err, "switching to Connected state",
+ dev->nodename);
+
return;
abort:
xenbus_transaction_end(xbt, 1);
goto abort_transaction;
}
- err = xenbus_switch_state(dev, xbt, XenbusStateInitialised);
- if (err)
- goto abort_transaction;
-
err = xenbus_transaction_end(xbt, 0);
if (err) {
if (err == -EAGAIN)
goto destroy_blkring;
}
+ xenbus_switch_state(dev, XenbusStateInitialised);
+
return 0;
abort_transaction:
return;
}
- (void)xenbus_switch_state(info->xbdev, XBT_NULL, XenbusStateConnected);
+ (void)xenbus_switch_state(info->xbdev, XenbusStateConnected);
/* Kick pending requests. */
spin_lock_irq(&blkif_io_lock);
xlvbd_del(info);
- xenbus_switch_state(dev, XBT_NULL, XenbusStateClosed);
+ xenbus_switch_state(dev, XenbusStateClosed);
}
kfree(copy);
- (void)xenbus_switch_state(info->xbdev, XBT_NULL, XenbusStateConnected);
+ (void)xenbus_switch_state(info->xbdev, XenbusStateConnected);
/* Now safe for us to use the shared ring */
spin_lock_irq(&blkif_io_lock);
if (err)
goto fail;
- err = xenbus_switch_state(dev, XBT_NULL, XenbusStateInitWait);
+ err = xenbus_switch_state(dev, XenbusStateInitWait);
if (err) {
goto fail;
}
break;
case XenbusStateClosing:
- xenbus_switch_state(dev, XBT_NULL, XenbusStateClosing);
+ xenbus_switch_state(dev, XenbusStateClosing);
break;
case XenbusStateClosed:
return;
}
- xenbus_switch_state(dev, XBT_NULL, XenbusStateConnected);
+ xenbus_switch_state(dev, XenbusStateConnected);
}
close_netdev(info);
- xenbus_switch_state(dev, XBT_NULL, XenbusStateClosed);
+ xenbus_switch_state(dev, XenbusStateClosed);
}
dev_dbg(&pdev->xdev->dev, "Connecting...\n");
- err = xenbus_switch_state(pdev->xdev, XBT_NULL, XenbusStateConnected);
+ err = xenbus_switch_state(pdev->xdev, XenbusStateConnected);
if (err)
xenbus_dev_fatal(pdev->xdev, err,
"Error switching to connected state!");
break;
case XenbusStateClosing:
- xenbus_switch_state(xdev, XBT_NULL, XenbusStateClosing);
+ xenbus_switch_state(xdev, XenbusStateClosing);
break;
case XenbusStateClosed:
goto out;
}
- err = xenbus_switch_state(pdev->xdev, XBT_NULL, XenbusStateInitialised);
+ err = xenbus_switch_state(pdev->xdev, XenbusStateInitialised);
if (err)
xenbus_dev_fatal(pdev->xdev, err,
"Error switching to initialised state!");
}
/* wait for xend to configure us */
- err = xenbus_switch_state(dev, XBT_NULL, XenbusStateInitWait);
+ err = xenbus_switch_state(dev, XenbusStateInitWait);
if (err)
goto out;
if (!err)
err = xenbus_printf(trans, pdev->xdev->nodename,
"magic", XEN_PCI_MAGIC);
- if (!err)
- err =
- xenbus_switch_state(pdev->xdev, trans,
- XenbusStateInitialised);
if (err) {
xenbus_transaction_end(trans, 1);
}
}
+ xenbus_switch_state(pdev->xdev, XenbusStateInitialised);
+
dev_dbg(&pdev->xdev->dev, "publishing successful!\n");
out:
}
}
- err = xenbus_switch_state(pdev->xdev, XBT_NULL, XenbusStateConnected);
+ err = xenbus_switch_state(pdev->xdev, XenbusStateConnected);
if (err)
goto out;
prev_state = xenbus_read_driver_state(pdev->xdev->nodename);
if (prev_state < XenbusStateClosing)
- err = xenbus_switch_state(pdev->xdev, XBT_NULL,
- XenbusStateClosing);
+ err = xenbus_switch_state(pdev->xdev, XenbusStateClosing);
if (!err && prev_state == XenbusStateConnected)
pcifront_disconnect(pdev);
goto fail;
}
- err = xenbus_switch_state(dev, XBT_NULL, XenbusStateInitWait);
+ err = xenbus_switch_state(dev, XenbusStateInitWait);
if (err) {
goto fail;
}
break;
case XenbusStateClosing:
- xenbus_switch_state(dev, XBT_NULL, XenbusStateClosing);
+ xenbus_switch_state(dev, XenbusStateClosing);
break;
case XenbusStateClosed:
goto abort;
}
- err = xenbus_switch_state(dev, xbt, XenbusStateConnected);
- if (err)
- goto abort;
-
- be->tpmif->status = CONNECTED;
-
err = xenbus_transaction_end(xbt, 0);
if (err == -EAGAIN)
goto again;
- if (err) {
+ if (err)
xenbus_dev_fatal(be->dev, err, "end of transaction");
- }
+
+ err = xenbus_switch_state(dev, XenbusStateConnected);
+ if (!err)
+ be->tpmif->status = CONNECTED;
return;
abort:
xenbus_transaction_end(xbt, 1);
EXPORT_SYMBOL_GPL(xenbus_watch_path2);
-int xenbus_switch_state(struct xenbus_device *dev,
- xenbus_transaction_t xbt,
- XenbusState state)
+int xenbus_switch_state(struct xenbus_device *dev, XenbusState state)
{
/* We check whether the state is currently set to the given value, and
if not, then the state is set. We don't want to unconditionally
unnecessarily. Furthermore, if the node has gone, we don't write
to it, as the device will be tearing down, and we don't want to
resurrect that directory.
+
+ Note that, because of this cached value of our state, this function
+ will not work inside a Xenstore transaction (something it was
+ trying to in the past) because dev->state would not get reset if
+ the transaction was aborted.
+
*/
int current_state;
if (state == dev->state)
return 0;
- err = xenbus_scanf(xbt, dev->nodename, "state", "%d",
- ¤t_state);
+ err = xenbus_scanf(XBT_NULL, dev->nodename, "state", "%d",
+ ¤t_state);
if (err != 1)
return 0;
- err = xenbus_printf(xbt, dev->nodename, "state", "%d", state);
+ err = xenbus_printf(XBT_NULL, dev->nodename, "state", "%d", state);
if (err) {
if (state != XenbusStateClosing) /* Avoid looping */
xenbus_dev_fatal(dev, err, "writing new state");
_dev_error(dev, err, fmt, ap);
va_end(ap);
- xenbus_switch_state(dev, XBT_NULL, XenbusStateClosing);
+ xenbus_switch_state(dev, XenbusStateClosing);
}
EXPORT_SYMBOL_GPL(xenbus_dev_fatal);
return 0;
fail:
xenbus_dev_error(dev, err, "xenbus_dev_probe on %s", dev->nodename);
- xenbus_switch_state(dev, XBT_NULL, XenbusStateClosed);
+ xenbus_switch_state(dev, XenbusStateClosed);
return -ENODEV;
}
if (drv->remove)
drv->remove(dev);
- xenbus_switch_state(dev, XBT_NULL, XenbusStateClosed);
+ xenbus_switch_state(dev, XenbusStateClosed);
return 0;
}
/**
* Advertise in the store a change of the given driver to the given new_state.
- * Perform the change inside the given transaction xbt. xbt may be NULL, in
- * which case this is performed inside its own transaction. Return 0 on
- * success, or -errno on error. On error, the device will switch to
- * XenbusStateClosing, and the error will be saved in the store.
+ * Return 0 on success, or -errno on error. On error, the device will switch
+ * to XenbusStateClosing, and the error will be saved in the store.
*/
-int xenbus_switch_state(struct xenbus_device *dev,
- xenbus_transaction_t xbt,
- XenbusState new_state);
+int xenbus_switch_state(struct xenbus_device *dev, XenbusState new_state);
/**